/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef OLA_PAL_OS_H
#define OLA_PAL_OS_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    const char *taskName;
    int level;
    unsigned int stackSize;
} OlaTaskParam;

typedef enum {
    OLA_TASK_ERROR = -1,
    OLA_TASK_READY = 0,
    OLA_TASK_RUNNING,
    OLA_TASK_BLOCKED,
    OLA_TASK_TERMINATED,
} OlaTaskStuts;

typedef void* OlaTask;

typedef void* OlaSem;

typedef void* OlaMutex;

typedef void (*OlaTaskFunc) (void *argument);

/*
 * 功能: 创建任务
 * 参数: func, 任务执行函数
 *       param, 任务执行函数入参
 *       taskParam, 任务相关参数
 * 返回: 任务句柄
 */
OlaTask OlaTaskCreate(OlaTaskFunc func, void *param, const OlaTaskParam *taskParam);

/*
 * 功能: 删除任务
 * 参数: handle, 任务句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaTaskDelete(OlaTask handle);

/*
 * 功能: 获取当前任务句柄
 * 返回: 当前任务句柄
 */
OlaTask OlaTaskGetCurTaskId(void);

/*
 * 功能: 将任务挂起暂停
 * 参数: handle, 任务句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaTaskSuspend(OlaTask handle);

/*
 * 功能: 将任务恢复唤醒
 * 参数: handle, 任务句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaTaskResume(OlaTask handle);

/*
 * 功能: 获取任务的运行状态
 * 参数: handle, 任务句柄
 * 返回: 任务当前的运行状态
 */
OlaTaskStuts OlaTaskGetState(OlaTask handle);

/*
 * 功能: 创建互斥锁
 * 返回: mutex句柄
 */
OlaMutex OlaMutexCreate(void);

/*
 * 功能: 销毁互斥锁
 * 参数: mutex, 互斥锁句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaMutexDestroy(OlaMutex mutex);

/*
 * 功能: 获取互斥锁
 * 参数: mutex, 互斥锁句柄
 *       timeout, 等待超时时间, 值为0xFFFFFFFF时不超时
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaMutexLock(OlaMutex mutex, unsigned int timeout);

/*
 * 功能: 释放互斥锁
 * 参数: mutex, 互斥锁句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaMutexUnLock(OlaMutex mutex);

/*
 * 功能: 创建信号量
 * 参数: initCount, 信号量初始值
 * 返回: 信号量句柄
 */
OlaSem OlaSemCreate(unsigned int initCount);

/*
 * 功能: 销毁信号量
 * 参数: handle, 信号量句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaSemDestroy(OlaSem handle);

/*
 * 功能: 释放信号量
 * 参数: handle, 信号量句柄
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaSemPost(OlaSem handle);

/*
 * 功能: 获取信号量
 * 参数: handle, 信号量句柄
 *       timeout, 等待超时时间，单位为ms
 * 返回: 0, 表示成功
 *       -1, 表示失败
 */
int OlaSemAcquire(OlaSem handle, unsigned int timeout);

/*
 * 功能: 毫秒级休眠
 * 参数: ms, 休眠时间
 */
void OlaSleepMs(unsigned int ms);

/*
 * 功能：获取系统运行时间
 * 参数：ms存储系统时间的缓冲区
 * 返回：0表示成功，返回其他失败
 */
int OlaGetTime(unsigned long long *ms);

/*
 * 功能：日志打印接口
 * 参数：format为格式字符，后面为可变参数
 * 返回：打印字符数
 */
int OlaPrintf(const char *format, ...);

/*
 * 功能: 申请内存空间
 * 参数: size, 申请内存的大小
 * 返回: 分配的内存空间指针
 */
void *OlaMalloc(unsigned int size);

/*
 * 功能: 释放申请的内存空间
 * 参数: ptr, 指向内存空间的指针
 */
void OlaFree(void *ptr);

#ifdef __cplusplus
}
#endif

#endif /* OLA_PAL_OS_H */
